package com.xygz.orm.transaction;

import com.xygz.orm.ORMManager;
import com.xygz.orm.exception.ORMException;

import java.sql.SQLException;

/**
 * 事务管理类，提供默认读ORM服务生成事务，以及指定生成事务方法
 *
 * @author xiyuan-lgz 2023-12-08 @version v1.0.0 新建与整理
 */
public interface TransactionManager {
    
    /**
     * 获取 事务管理器
     *
     * @return 获取事务管理器
     * @throws ORMException 异常信息
     */
    public static TransactionManager get() throws ORMException {
        return ORMManager.instance().getTransactionManager();
    }
    
    /**
     * 获取 事务管理器
     *
     * @return 获取事务管理器
     * @throws ORMException 异常信息
     */
    public static TransactionManager getDefault() throws ORMException {
        return ORMManager.instance().getDefaultTransactionManager();
    }
    
    /**
     * 判断是否已添加事务服务
     *
     * @param id 事务编号
     * @return =true表示已添加
     */
    public boolean hasTransactionService(String id);
    
    /**
     * 添加事务服务
     *
     * @param service 事务服务
     */
    public void addTransactionService(TransactionService service);
    
    /**
     * 移除事务服务
     *
     * @param id 事务服务编号
     */
    public void removeTransactionService(String id);
    
    /**
     * 移除事务服务
     *
     * @param service 事务服务
     */
    public void removeTransactionService(TransactionService service);
    
    /**
     * 开始单个事务，指定事务编号
     *
     * @param id 事务编号
     * @return Transaction  得到事务
     * @throws ORMException ORM 异常
     * @throws SQLException 数据库异常
     */
    public Transaction beginTransaction(String id) throws ORMException, SQLException;
    
    /**
     * 开始事务，指定多个事务编号
     *
     * @param ids 事务编号字符串，多个用逗号隔开
     * @return Transaction  得到事务
     * @throws ORMException ORM 异常
     * @throws SQLException 数据库异常
     */
    public Transaction beginTransactions(String ids) throws ORMException, SQLException;
    
    /**
     * 开始事务，指定事务编号数组
     *
     * @param ids 事务编号数组
     * @return Transaction  得到事务
     * @throws ORMException ORM 异常
     * @throws SQLException 数据库异常
     */
    public Transaction beginTransaction(String... ids) throws ORMException, SQLException;
    
    
    /**
     * 关闭指定事务
     *
     * @param ids 事务服务
     */
    public void closeTransaction(String... ids);
}
